//#include <stdint.h>
#include <string.h>
#include "top_reg.h"
#include "cv1835_pinmux.h"
#include "cv1835_reg_fmux_gpio.h"
#include "cv1835_pinlist_swconfig.h"
#include "hal_pinmux.h"
#include "mmio.h"
#include "pinctrl-cv1835.h"

void hal_pinmux_config(int io_type)
{

	switch(io_type) {
		case PINMUX_UART0:
			PINMUX_CONFIG(UART0_RX, UART0_RX);
			PINMUX_CONFIG(UART0_TX, UART0_TX);
		break;
		case PINMUX_UART1:
			PINMUX_CONFIG(UART1_RX, UART1_RX);
			PINMUX_CONFIG(UART1_TX, UART1_TX);
			PINMUX_CONFIG(UART1_CTS, UART1_CTS);
			PINMUX_CONFIG(UART1_RTS, UART1_RTS);
		break;
		case PINMUX_UART2:
			PINMUX_CONFIG(UART2_RX, UART2_RX);
			PINMUX_CONFIG(UART2_TX, UART2_TX);
			PINMUX_CONFIG(UART2_CTS, UART2_CTS);
			PINMUX_CONFIG(UART2_RTS, UART2_RTS);
		break;
		case PINMUX_UART3:
			PINMUX_CONFIG(PWM2, UART3_RX);
			PINMUX_CONFIG(PWM3, UART3_TX);
		break;
		case PINMUX_I2C0:
			PINMUX_CONFIG(IIC0_SCL, IIC0_SCL);
			PINMUX_CONFIG(IIC0_SDA, IIC0_SDA);
		break;
		case PINMUX_I2C1:
			PINMUX_CONFIG(IIC1_SCL, IIC1_SCL);
			PINMUX_CONFIG(IIC1_SDA, IIC1_SDA);
		break;
		case PINMUX_I2C2:
			PINMUX_CONFIG(IIC2_SCL, IIC2_SCL);
			PINMUX_CONFIG(IIC2_SDA, IIC2_SDA);
		break;
		case PINMUX_I2C3:
			PINMUX_CONFIG(IIC3_SCL, IIC3_SCL);
			PINMUX_CONFIG(IIC3_SDA, IIC3_SDA);
		break;
		case PINMUX_I2C4:
			PINMUX_CONFIG(SPI0_SCK, IIC4_SCL);
			PINMUX_CONFIG(SPI0_CS_X, IIC4_SDA);
		break;
		case PINMUX_SPI0:
			PINMUX_CONFIG(SPI0_SCK, SPI0_SCK);
			PINMUX_CONFIG(SPI0_CS_X, SPI0_CS_X);
			PINMUX_CONFIG(SPI0_SDI, SPI0_SDI);
			PINMUX_CONFIG(SPI0_SDO, SPI0_SDO);
		break;
		case PINMUX_SPI1:
			PINMUX_CONFIG(RMII0_MDCK, SPI1_SCK);
			PINMUX_CONFIG(RMII0_RXDV, SPI1_CS_X);
			PINMUX_CONFIG(RMII0_REFCLKI, SPI1_SDI);
			PINMUX_CONFIG(RMII0_MDIO, SPI1_SDO);
		break;
		case PINMUX_SPI2:
			PINMUX_CONFIG(IIC3_SCL, SPI2_SCK);
			PINMUX_CONFIG(IIC3_SDA, SPI2_CS_X);
			PINMUX_CONFIG(IIC0_SCL, SPI2_SDI);
			PINMUX_CONFIG(IIC0_SDA, SPI2_SDO);
		break;
		case PINMUX_SPI3:
			printf ("fix me\n");
		break;
		case PINMUX_I2S1:
			PINMUX_CONFIG(UART1_RTS, IIS1_DI);
			PINMUX_CONFIG(UART2_RTS, IIS1_MCLK);
			PINMUX_CONFIG(UART1_CTS, IIS1_DO);
			PINMUX_CONFIG(UART1_TX, IIS1_BCLK);
			PINMUX_CONFIG(UART1_RX, IIS1_LRCK);
		break;
		case PINMUX_I2S2:
			PINMUX_CONFIG(RMII0_TXEN, IIS2_DI);
			PINMUX_CONFIG(EMMC_RSTN, IIS2_MCLK);
			PINMUX_CONFIG(RMII0_TXD1, IIS2_DO);
			PINMUX_CONFIG(RMII0_RST, IIS2_BCLK);
			PINMUX_CONFIG(RMII0_TXD0, IIS2_LRCK);
		break;
		case PINMUX_SDIO0:
			PINMUX_CONFIG(SDIO0_CD, SDIO0_CD);
			PINMUX_CONFIG(SDIO0_PWR_EN, SDIO0_PWR_EN);
			PINMUX_CONFIG(SDIO0_CMD, SDIO0_CMD);
			PINMUX_CONFIG(SDIO0_CLK, SDIO0_CLK);
			PINMUX_CONFIG(SDIO0_D0, SDIO0_D_0);
			PINMUX_CONFIG(SDIO0_D1, SDIO0_D_1);
			PINMUX_CONFIG(SDIO0_D2, SDIO0_D_2);
			PINMUX_CONFIG(SDIO0_D3, SDIO0_D_3);
		break;
		case PINMUX_SDIO1:
			PINMUX_CONFIG(RMII0_MDIO, SDIO1_CMD);
			PINMUX_CONFIG(RMII0_MDCK, SDIO1_CLK);
			PINMUX_CONFIG(RMII0_REFCLKI, SDIO1_D_0);
			PINMUX_CONFIG(RMII0_RXD1, SDIO1_D_1);
			PINMUX_CONFIG(RMII0_RXD0, SDIO1_D_2);
			PINMUX_CONFIG(RMII0_RXDV, SDIO1_D_3);
		break;
		case PINMUX_EMMC:
			PINMUX_CONFIG(EMMC_CLK, EMMC_CLK);
			PINMUX_CONFIG(EMMC_RSTN, EMMC_RSTN);
			PINMUX_CONFIG(EMMC_CMD, EMMC_CMD);
			PINMUX_CONFIG(EMMC_DAT1, EMMC_DAT_1);
			PINMUX_CONFIG(EMMC_DAT0, EMMC_DAT_0);
			PINMUX_CONFIG(EMMC_DAT2, EMMC_DAT_2);
			PINMUX_CONFIG(EMMC_DAT3, EMMC_DAT_3);
		break;
		case PINMUX_SPI_NOR:
			PINMUX_CONFIG(EMMC_CLK, SPINOR_SCK);
			PINMUX_CONFIG(EMMC_CMD, SPINOR_SDI);
			PINMUX_CONFIG(EMMC_DAT1, SPINOR_CS_X);
			PINMUX_CONFIG(EMMC_DAT0, SPINOR_SDO);
			PINMUX_CONFIG(EMMC_DAT2, SPINOR_HOLD_X);
			PINMUX_CONFIG(EMMC_DAT3, SPINOR_WP_X);
		break;
		case PINMUX_SPI_NAND:
			PINMUX_CONFIG(EMMC_CLK, SPINAND_CLK);
			PINMUX_CONFIG(EMMC_CMD, SPINAND_DI);
			PINMUX_CONFIG(EMMC_DAT1, SPINAND_CS);
			PINMUX_CONFIG(EMMC_DAT0, SPINAND_DO);
			PINMUX_CONFIG(EMMC_DAT2, SPINAND_HOLD);
			PINMUX_CONFIG(EMMC_DAT3, SPINAND_WP);
		break;
		case PINMUX_CAM0:
			PINMUX_CONFIG(CAM_PD0, CAM_MCLK1);
			PINMUX_CONFIG(CAM_MCLK0, CAM_MCLK0);
		break;
		case PINMUX_VI0:
			printf ("fix me\n");
		break;
		case PINMUX_VO:
			printf ("fix me\n");
		break;
		case PINMUX_PWM1:
			PINMUX_CONFIG(UART1_TX, PWM_4);
			PINMUX_CONFIG(UART1_RX, PWM_5);
			PINMUX_CONFIG(UART1_CTS, PWM_6);
			PINMUX_CONFIG(UART1_RTS, PWM_7);
		break;
		default:
		break;
	}
}
